//
//  SKYIndex.h
//  SkyonSDK
//
//  Created by 张二帅 on 2018/5/5.
//  Copyright © 2018年 Skyon. All rights reserved.
//

#import <Foundation/Foundation.h>

#undef SKYConfigInstance
#define SKYConfigInstance [SKYAnalyticsConfig sharedInstance]

/**
 定期循环采集信息策略
 
 - SKYRegularReport_Close: 关闭
 - SKYRegularReport_Open: 开启，默认60s
 - SKYRegularReport_Custom: 自定义时间，参考[Skyon setRegularReportInterval:100];
 */
typedef NS_ENUM(NSInteger,SKYRegularReportPolicy) {
    SKYRegularReport_Close,
    SKYRegularReport_Open,
    SKYRegularReport_Custom
};

NS_ASSUME_NONNULL_BEGIN


/**
 信息采集SDK的配置实例，具体参考该类成员的参数定义
 参数支持全局设置，示例：SKYConfigInstance.userId = @"xxxxxxx...";
 */
@interface SKYAnalyticsConfig : NSObject
/** 可选: appkey，默认：nil */
@property (nonatomic, copy) NSString *appkey;
/** 可选: 用户ID ,默认：nil */
@property (nonatomic, copy, nullable) NSString *userId;
/** 可选：AppID，默认：nil */
@property (nonatomic, copy, nullable) NSString *appId;
/** 可选: 是否开启崩溃信息采集，默认：开启 */
@property (nonatomic) BOOL  bCrashReportEnabled;
/** 可选: 定期循环采集策略，默认：SKYRegularReport_Open */
@property (nonatomic) SKYRegularReportPolicy regularReportPolicy;
/** 可选: 是否开启页面路径信息采集，默认开启 */
@property (nonatomic) BOOL viewPathReportEnabled;
/** 可选：是否开启webView页面信息采集，默认开启 */
@property (nonatomic) BOOL webViewReportEnabled;

- (id)init __attribute__((unavailable("请通过宏SKYConfigInstance实例化")));

/** 实例化方法，参考通过宏：SKYConfigInstance 调用 */
+ (instancetype)sharedInstance;

@end


/**
 - 信息采集初始化、配置、信息获取类
 - 初始化示例代码：
 - SKYConfigInstance.appkey = @"xxxxxxx...";
 - SKYConfigInstance.appId = @"xxxxxxx...";
 - SKYConfigInstance.userId = @"xxxxxxx...";
 - [Skyon startLocation];
 - [Skyon startBatteryMonitoring];
 - [Skyon startWithConfigure:SKYConfigInstance];
- - -
 */
@interface Skyon : NSObject

#pragma mark - 初始化采集

/**
 初始化信息采集模块，初始化函数只需要调用一次，支持在初始化后修改SKYAnalyticsConfig中参数，修改后参数将在下次采集中使用
 针对定期循环采集策略请在初始化前设置

 @param configure 采集分析配置实例，参考该类定义
 */
+ (void)startWithConfigure:(SKYAnalyticsConfig *)configure;

#pragma mark - 设置

/**
 设置是否打印SDK的log信息，默认NO（不打印log）

 @param value 设置为YES，输出log信息仅供参考。除非特殊需要，否则发布产品时需改回NO
 */
+ (void)setLogEnabled:(BOOL)value;

/**
 当regularReportPolicy == SKYRegularReport_Custom 时设定定期采集发送间隔
 若设置小于等于0s，则默认60s
 @param second 单位为秒
 */
+ (void)setRegularReportInterval:(int)second;

/**
 设置信息采集提交URLString：
 示例：http://mcms.fsc.tp95589.com/TX0B004

 @param URLString 信息采集提交地址
 */
+ (void)setInfoAcquisitionReportURLString:(NSString *)URLString;

/**
 app获取到wifi列表信息调用，设置后SDK会在下次信息采集中进行提交，也可通过reportInfoParameter:completion:进行主动提交
 wifi列表获取：获取app需向 Apple 申请开发 Network Extension 权限、申请包含 Network Extension 的描述文件、配置 Info.plist、配置 entitlements

 @param wifiNameList wifi名称列表(数据结构："wifiName1,wifiName2,...")
 */
+ (void)setInfoAcquisitionWifiNameList:(NSString *)wifiNameList;

/**
 设置忽略追踪页面名称，可以多次设置

 @param pageName 忽略追踪页面名称(UIViewController子类名称)
 */
+ (void)setIgnoreTrackPage:(NSString *)pageName;

/**
 设置忽略追踪页面列表

 @param pageNames 忽略追踪页面列表(UIViewController子类名称)
 */
+ (void)setIgnoreTrackPages:(NSArray <NSString *>*)pageNames;

/**
 此方法慎用
 1、若通过keychain从service、account中取值不为空，则该值覆盖SDK内部唯一标识
 2、若通过keychain从service、account中取值为空，则设置该值为SDK内部唯一标识
（SDK内部设备唯一标识符：iOS7以上运用keychain结合UIDevice的identifierForVendor取得设备唯一标识。）
 
 @param service 服务
 @param account 帐户
 */
+ (void)keychainPasswordService:(NSString *)service account:(NSString *)account API_AVAILABLE(ios(7.0));

/**
 开始定位，定位与gpsReportEnabled无关。请确保app内有申请定位权限，否则无效
 */
+ (void)startLocation;

/**
 停止定位，请确保app内有申请定位权限，否则无效
 */
+ (void)stopLocation;

/**
 开启电池监控
 */
+ (void)startBatteryMonitoring;

/**
 关闭电池监控
 */
+ (void)stopBatteryMonitoring;


#pragma mark - 自定义采集信息
/**
 自定义事件，内部调用+(void)event:eventCode:eventDescribe:,默认事件编号和描述

 @param event 事件名称
 */
+ (void)event:(NSString *)event;

/**
 自定义事件

 @param event 事件名称
 @param eventCode 事件编号。可传空值，空值时内部默认事件编号为：7
 @param eventDescribe 事件描述。可传空值，空值时内部默认事件描述为：自定义事件采集
 */
+ (void)event:(NSString *)event eventCode:(nullable NSString *)eventCode eventDescribe:(nullable NSString *)eventDescribe;

/**
 提交指定采集信息

 @param param 采集信息参数
 @param completionHandler 提交完成回调，error == nil 代表提交成功，否则包含错误信息
 */
+ (void)reportInfoParameter:(NSArray <NSString *>*)param completion:(nullable void (^)(NSError * _Nullable error))completionHandler;



#pragma mark - info methods

/**
 设备名称

 @return 设备名称
 */
+ (NSString *)deviceName;

/**
 设备默认语言

 @return 设备默认语言
 */
+ (NSString *)deviceDefaultLanguage;

/**
 设备型号

 @return 设备型号
 */
+ (NSString *)deviceModel;

/**
 操作系统平台

 @return 操作系统平台
 */
+ (NSString *)deviceSystemName;

/**
 运营商类型

 @return 运营商类型
 */
+ (NSString *)telephonyCarrierName;

/**
 操作系统版本

 @return 操作系统版本
 */
+ (NSString *)deveceSystemVersion;

/**
 移动国家码与网络码

 @return 移动国家码与网络码
 */
+ (NSString *)telephonyMCCAndMNC;

/**
 设备分辨率

 @return 设备分辨率
 */
+ (NSString *)deviceResolution;

/**
 设备开机时间，单位毫秒

 @return 设备开机时间
 */
+ (NSString *)deviceElapseBootTime;

/**
 当前海拔高度，单位米，请确保设置[Skyon startLocation]，否则返回为空值

 @return 海拔高度
 */
+ (NSString *)currentAltitude;

/**
 系统日期与时间，格式为：yyyy-MM-dd,HH:mm:ss

 @return 格式化后的系统日期与时间
 */
+ (NSString *)systemDateTime;

/**
 是否支持GPS

 @return 是否支持GPS
 */
+ (BOOL)isLocationEnabled;

/**
 当前经纬度信息（维度,经度），请确保设置[Skyon startLocation]，否则返回为空值

 @return 当前经纬度信息
 */
+ (NSString *)currentLocationInfo;

/**
 是否支持蓝牙

 @return 是否支持蓝牙
 */
+ (BOOL)isBluetoothSupported;

/**
 是否连接了wifi

 @return 是否连接了wifi
 */
+ (BOOL)isConnectWifi;

/**
 是否支持陀螺仪

 @return 是否支持陀螺仪
 */
+ (BOOL)isGyroscopeAvailable;

/**
 是否是移动设备

 @return 是否是移动设备
 */
+ (BOOL)isMobileDevice;

/**
 wifi的mac地址

 @return wifi的mac地址
 */
+ (nullable NSString *)wifiMacAddress;

/**
 设备唯一标识：
 iOS7以下：设备mac地址
 iOS7以上运用keychain结合UIDevice的identifierForVendor取得设备唯一标识。

 @return 设备唯一标识
 */
+ (NSString *)uniqueDeviceIdentifier;

/**
 当前网络IP

 @return 当前网络IP
 */
+ (nullable NSString *)networkIP;

/**
 屏幕密度DPI

 @return 屏幕密度DPI
 */
+ (NSString *)deviceDPI;

/**
 设备像素密度PPI

 @return 设备像素密度PPI
 */
+ (NSString *)devicePPI;

/**
 是否支持NFC

 @return 是否支持NFC
 */
+ (BOOL)isNFCAvailable;

/**
 设备磁盘容量

 @return 设备磁盘容量
 */
+ (NSString *)deviceDiskSize;

/**
 设备已用磁盘容量

 @return 设备已用磁盘容量
 */
+ (NSString *)deviceUsedDiskSize;

/**
 设备可用磁盘容量

 @return 设备可用磁盘容量
 */
+ (NSString *)deviceAvailableDiskSize;

/**
 设备内核版本信息

 @return 内核版本信息
 */
+ (NSString *)deviceCoreInfo;

/**
 CPU架构信息（CPU型号）

 @return CPU架构信息
 */
+ (NSString *)cpuArchitectureDescription;

/**
 CPU核心数

 @return CPU核心数
 */
+ (NSUInteger)cpuProcessorCount;

/**
 设备是否越狱

 @return 设备是否越狱
 */
+ (BOOL)isJailbroken;

/**
 CPU当前频率，单位：KHZ

 @return CPU当前频率
 */
+ (NSString *)cpuFrequency;

/**
 电池状态描述，确保开启[Skyon startBatteryMonitoring]，否则返回空值

 @return 电池状态描述
 */
+ (NSString *)batteryStateDescribe;

/**
 当前电池电量，确保开启[Skyon startBatteryMonitoring]，否则返回空值

 @return 当前电池电量
 */
+ (NSString *)batteryLevel;

/**
 电池剩余容量（相对总容量），确保开启[Skyon startBatteryMonitoring]，否则返回空值

 @return 电池容量
 */
+ (NSUInteger)batteryCapacity;

/**
 应用版本号

 @return 应用版本号
 */
+ (NSString *)applicationVersion;

/**
 应用名称

 @return 应用名称
 */
+ (NSString *)applicationName;

/**
 应用包名，对应：CFBundleIdentifier

 @return 应用包名
 */
+ (NSString *)applicationPackageName;

/**
 广告标识符IDFA
 注意：设备广告追踪开关切换的时候IDFA会变，还原的时候会变，用户重置手机系统的时候也会变。
 用户若限制广告追踪则返回空值

 @return 广告标识符IDFA
 */
+ (NSString *)advertisingIdentifier;


@end

NS_ASSUME_NONNULL_END
